package com.test.xq.customdemo.customtools;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.PictureDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import com.test.xq.customdemo.R;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by xq on 17/4/24.
 */


//Canvas之图片文字
public class CustomView3 extends View {

    //创建Picture
    private Picture mPicture = new Picture();
    private int mWidth, mHeight;

    private Bitmap bitmap;

    public CustomView3(Context context) {
        super(context);
    }

    public CustomView3(Context context, AttributeSet attrs) {
        super(context, attrs);
        recording();
        bitmap = getBitmap(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //displayPic(canvas);
        //drawBitmap(canvas,bitmap);
        drawText(canvas);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }

    //录制内容的方法
    private void recording(){
        //开始录制（接收返回值canvas）
        Canvas canvas = mPicture.beginRecording(500,500);
        //创建一个画笔
        Paint mPaint = new Paint();
        mPaint.setColor(Color.BLUE);
        mPaint.setStyle(Paint.Style.FILL);

        //在canvas中的具体操作
        //位移
        canvas.translate(250,250);
        //绘制一个圆
        canvas.drawCircle(0,0,100,mPaint);

        //结束录制
        mPicture.endRecording();

    }

    private void displayPic(Canvas canvas){
        Log.v("xq_msg", "屏幕的宽高： " + mWidth + "  " + mHeight + "  " + mPicture.getWidth());
        //将picture中的内容绘制在canvas上 方法1对canvas有影响  一般不会使用
        // 方法1
        //mPicture.draw(canvas);

        //方法2
        //canvas.drawPicture(mPicture);
        //如图所示我们的圆变成了椭圆，是什么造成的呢，这里我们的绘制的时候传入了一个矩形，
        // 这个矩形就是用来压缩我们的begin开始录制的时候返回的画布的，当时我们设置为500，500.
        // 可以看到我们这里的方法是宽保持不变，高度变为原来的二分之一一，就把原来的圆压缩为现在的椭圆了。
        //canvas.drawPicture(mPicture,new RectF(0,0,mPicture.getWidth(),200));


        //方法3
        //PictureDrawable pictureDrawable = new PictureDrawable(mPicture);
        //pictureDrawable.draw(canvas);

        PictureDrawable pictureDrawable = new PictureDrawable(mPicture);
        // 设置绘制区域 -- 注意此处所绘制的实际内容不会缩放
        pictureDrawable.setBounds(0,0,250,mPicture.getHeight());
        // 绘制
        pictureDrawable.draw(canvas);

    }

    //Bitmap就是很多问题的根源啊有木有，Bitmap可能导致内存不足，内存泄露，ListView中的复用混乱等诸多问题。
    private  Bitmap getBitmap(Context context){
        //通过BitmapFactory从不同位置获取Bitmap:
        //资源文件(drawable):
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);

        //资源文件(assets):
//        Bitmap bitmap= null;
//        try {
//            InputStream is = context.getAssets().open("ic_launcher.png");
//            bitmap = BitmapFactory.decodeStream(is);
//            is.close();
//        } catch (IOException e) {e.printStackTrace();
//
//        }

        //内存卡文件:
        //Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png");
        return bitmap;
    }

    //绘制bitmap
    private void drawBitmap(Canvas canvas,Bitmap bitmap){
        ////图片左上角位置默认为坐标原点。
        //第一种方法中后两个参数(matrix, paint)是在绘制的时候对图片进行一些改变，如果只是需要将图片内容绘制出来只需要如下操作就可以了
        //canvas.drawBitmap(bitmap,new Matrix(),new Paint());

        //第二种方法就是在绘制时指定了图片左上角的坐标(距离坐标原点的距离)：
        //canvas.drawBitmap(bitmap,200,500,new Paint());

        //第三种方法比较有意思，上面多了两个矩形区域(src,dst),这两个矩形选区是干什么用的？
        // 将画布坐标系移动到画布中央
        canvas.translate(mWidth/2,mHeight/2);
        // 指定图片绘制区域(左上角的四分之一)
        Rect src = new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2);
        // 指定图片在屏幕上显示的区域
        Rect dst = new Rect(0,0,200,400);

        // 绘制图片
        canvas.drawBitmap(bitmap,src,dst,null);
    }

    //绘制文字
    private void drawText(Canvas canvas){
        Paint textPaint = new Paint();  // 创建画笔
        textPaint.setColor(Color.BLACK);  // 设置颜色
        textPaint.setStyle(Paint.Style.FILL);   // 设置样式
        textPaint.setTextSize(50);  // 设置字体大小

        //第一类(drawText)
        String str = "ABCDEFG";
        // 参数分别为 (文本 基线x 基线y 画笔)
        //canvas.drawText(str,200,500,textPaint);
        // 参数分别为 (字符串 开始截取位置 结束截取位置 基线x 基线y 画笔)
        //canvas.drawText(str,1,3,200,500,textPaint);
        //另外，对于字符数组char[]我们截取字符串使用起始位置(index)和长度(count)来确定。
        //同样，我们指定index为1，count为3，那么最终截取到的字符串是”BCD”.
        //其实就是从下标位置为1处向后数3位就是截取到的字符串，示例：
        //char[] chars = str.toCharArray();
        // 参数为 (字符数组 起始坐标 截取长度 基线x 基线y 画笔)
        //canvas.drawText(chars,1,3,200,500,textPaint);

        //第二类(drawPosText)
        canvas.drawPosText(str,new float[]{
                100,100,    // 第一个字符位置
                200,200,    // 第二个字符位置
                300,300,    // ...
                400,400,
                500,500,
                600,600,
                700,700
        },textPaint);


    }

}
